home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Skinny3DSample / Skinny3DSources ƒ / SkinnyMain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-21  |  8.6 KB  |  386 lines  |  [TEXT/MPS ]

  1. #include    "SkinnyMain.h"
  2. #include     "3DAppSpecific.h"
  3.  
  4. #include <Printing.h>
  5. #include <AppleEvents.h>
  6. #include <Windows.h>
  7. #include <Fonts.h>
  8. #include <Desk.h>
  9. #include <ToolUtils.h>
  10. #include <TextUtils.h>
  11. #include <LowMem.h>
  12. #include <SegLoad.h>
  13.  
  14. #define        kMinHeap    100000
  15.  
  16. enum { aboutBoxID = 129 }; // resource IDs
  17.  
  18. Boolean        gDone = false;                /* true when Quit is selected */
  19. Boolean        gInBackGround = false;        /* true if we are in the background */
  20. THPrint        gPrintH;
  21. CursHandle    gWatchCursor;
  22.  
  23. // local prototypes
  24. static void MainEventLoop(void);
  25. static void DoClick(EventRecord *evt);
  26.  
  27. static void DoKey(EventRecord *evt);
  28. static void DoUpdate(EventRecord *evt);
  29. static void DoActivate(EventRecord *evt);
  30. static void DoOSEvent(EventRecord *evt);
  31.  
  32. static void UpdateMenus(void);
  33. static void DoMenu(long msel);
  34. static void ChooseApple(short itemNumber);
  35. static void ChooseFile(short item);
  36. static void ChooseEdit(short item);
  37. static void DoPageSetup(void);
  38.  
  39. static OSErr InstallAEHandlers(void);
  40. static pascal OSErr AEOpenHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  41. static pascal OSErr AEOpenDocHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  42. static pascal OSErr AEPrintHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  43. static pascal OSErr AEQuitHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  44.  
  45.  
  46. //==============================================================
  47. void main(void)
  48. {
  49.     long    masterBlocks = 10;
  50.     long     err;
  51.  
  52.     MaxApplZone();
  53.     while ( masterBlocks-- )
  54.         MoreMasters();
  55.  
  56.     InitGraf(&qd.thePort);
  57.     InitFonts();
  58.     InitWindows();
  59.     InitMenus();
  60.     InitCursor();
  61.     TEInit();
  62.     FlushEvents(everyEvent, 0);
  63.     InitDialogs(0L);
  64.     gWatchCursor = GetCursor(watchCursor);
  65.     if (!gWatchCursor)
  66.         return;
  67.     HNoPurge((Handle) gWatchCursor);
  68.  
  69.     err = InitializeApplication(); // app-specific
  70.     if (err != noErr) {
  71.         ErrMsg("\pInitialization failed.");
  72.         return;
  73.     }
  74.     
  75.     DoNew(); // app-specific
  76.     MainEventLoop();
  77.  
  78.     Cleanup();
  79. }
  80.  
  81.  
  82. //------------------------------------
  83. static void MainEventLoop(void)
  84. {
  85.     EventRecord    event;
  86.     Boolean        gotEvent;
  87.     long        grow;
  88.     
  89.     while    (!gDone) {
  90.         gotEvent = WaitNextEvent(everyEvent, &event, 10, nil);
  91.         if (gotEvent) {
  92.             switch(event.what) {
  93.                 case nullEvent:                                break;
  94.                 case mouseDown:        DoClick(&event);        break;
  95.                 case mouseUp:                                 break;
  96.                 case keyDown:        DoKey(&event);            break;
  97.                 case keyUp:                                     break;
  98.                 case autoKey:        DoKey(&event);            break;
  99.                 case updateEvt:        DoUpdate(&event);        break;
  100.                 case diskEvt:                                 break;
  101.                 case activateEvt:    DoActivate(&event);        break;
  102.                 case osEvt:            DoOSEvent(&event);        break;
  103.                 default:                                    break;
  104.             }
  105.         }
  106.         if (MaxMem(&grow) < kMinHeap) {
  107.         ErrMsg("\pSorry, need to quit (too many memory leaks)");
  108.         gDone = true;
  109.         }
  110.     }
  111. }
  112.  
  113.  
  114. //------------------------------------
  115. static void DoKey(EventRecord *evt)
  116. {
  117.     char c = (char)evt->message & charCodeMask;
  118.     
  119.     if ((evt->modifiers & cmdKey)) {
  120.         UpdateMenus();
  121.         DoMenu(MenuKey(evt->message & charCodeMask));
  122.     }
  123. }
  124.  
  125.  
  126. //------------------------------------
  127. static void DoUpdate(EventRecord *evt)
  128. {
  129.     WindowPtr    updateWindow;
  130.     GrafPtr        savePort;
  131.     
  132.     GetPort(&savePort);
  133.     updateWindow = (WindowPtr)evt->message;
  134.     SetPort(updateWindow);
  135.     BeginUpdate(updateWindow);                        
  136.  
  137.     DrawAppSpecificContent(updateWindow); // app-specific; erase as required
  138.  
  139.     EndUpdate(updateWindow);
  140.     SetPort(savePort);
  141. }
  142.  
  143.  
  144. //------------------------------------
  145. static void DoActivate(EventRecord *evt)
  146. {
  147.     ActivateWindow((WindowPtr)evt->message, (evt->modifiers & activeFlag));
  148. }
  149.  
  150. //------------------------------------
  151. static void DoOSEvent(EventRecord *evt)
  152. {
  153.     if ( (evt->message >> 24) == suspendResumeMessage)
  154.         gInBackGround = !(evt->message & resumeFlag);
  155. }
  156.  
  157. //------------------------------------
  158. static void DoClick(EventRecord *evt)
  159. {
  160.     WindowPtr    w;
  161.     
  162.     switch (FindWindow(evt->where, &w)) {
  163.         case inDesk:        break;
  164.         case inMenuBar:        UpdateMenus();
  165.                             DoMenu(MenuSelect(evt->where));
  166.                             break;
  167.         case inSysWindow:    SystemClick(evt, w);
  168.                             break;
  169.         case inContent:        if (w != FrontWindow())
  170.                                 SelectWindow(w);
  171.                             else {
  172.                                 SetPort(w);
  173.                                 DoClickInContent(evt, w);
  174.                             }
  175.                             break;
  176.         case inDrag:        DragWindow(w, evt->where, &qd.screenBits.bounds);
  177.                             break;
  178.         case inGoAway:        if (TrackGoAway(w, evt->where))
  179.                                 DoClose();
  180.                             break;
  181.         default:            break;
  182.     }
  183. }
  184.  
  185.  
  186.  
  187. //------------------------------------
  188. static void UpdateMenus(void)
  189. {
  190.     MenuHandle    menu = GetMenuHandle(mFile);
  191.     if (PreflightNew()) // application-specific
  192.         EnableItem(menu, iNew);
  193.     else
  194.         DisableItem(menu, iNew);
  195.     if (FrontWindow())
  196.         EnableItem(menu, iClose);
  197.     else
  198.         DisableItem(menu, iClose);
  199.     UpdateAppMenus();
  200. }
  201.  
  202.  
  203. //------------------------------------
  204. static void DoMenu(long msel)
  205. {
  206.     short item = LoWord(msel);
  207.     short menu = HiWord(msel);
  208.  
  209.     switch (menu) {
  210.         case mApple: ChooseApple(item);        break;
  211.         case mFile : ChooseFile(item);        break;
  212.         case mEdit : ChooseEdit(item);        break;
  213.         default :     DoAppSpecificMenu(menu, item); // app-specific
  214.     }
  215.     HiliteMenu(0);
  216. }
  217.  
  218.  
  219. //------------------------------------
  220. static void ChooseApple(short itemNumber)
  221. {
  222.     short dontCare;
  223.     
  224.     if (itemNumber == iAbout)
  225.     {
  226.         dontCare = Alert(aboutBoxID, nil);
  227.     } 
  228.     else 
  229.     {
  230.         GrafPtr        savePort;
  231.         Str255        daName;
  232.         short        daRefNum;
  233.         
  234.         GetPort(&savePort);
  235.         GetMenuItemText(GetMenuHandle(mApple), itemNumber, daName);
  236.         daRefNum = OpenDeskAcc(daName);
  237.         SetPort(savePort);
  238.     }
  239. }
  240.  
  241. //------------------------------------
  242. static void ChooseFile(short item)
  243. {
  244.     switch(item) {
  245.         case iNew    :        DoNew();
  246.             break;
  247.         case iOpen    :        DoOpen();
  248.             break;
  249.         case iClose    :        DoClose();
  250.             break;
  251.         case iSave    :        DoSave();
  252.             break;
  253.         case iSaveAs:        DoSaveAs();
  254.             break;
  255.         case iPageSetup    :    DoPageSetup();
  256.             break;
  257.         case iPrint    :        DoPrint();
  258.             break;
  259.         case iQuit    :        gDone = true;
  260.             break;
  261.     }
  262. }
  263.  
  264. //------------------------------------
  265. static void ChooseEdit(short item)
  266. // Does not support edit menu right now
  267. {
  268.     SystemEdit(item-1);
  269. }
  270.  
  271.  
  272. //------------------------------------
  273. static void DoPageSetup( void )
  274. {
  275.     Boolean    ignore;
  276.     short    err;
  277.     
  278.     PrOpen();
  279.     if ((err = PrError()) != 0) {
  280.         ErrMsgCode("\p PrOpen failed.",err);
  281.         return;
  282.     }
  283.     ignore = PrStlDialog(gPrintH);
  284.     PrClose();
  285. }
  286.  
  287.  
  288. //-------------------------------
  289. static OSErr InstallAEHandlers(void)
  290. {
  291.     OSErr    err;
  292.     
  293.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(AEOpenHandler), 0, false);
  294.     if ( err ) goto problem;
  295.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(AEOpenDocHandler), 0, false);
  296.     if ( err ) goto problem;
  297.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(AEQuitHandler), 0, false);
  298.     if ( err ) goto problem;
  299.     err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(AEPrintHandler), 0, false);
  300.     if ( err ) goto problem;
  301.     return noErr;
  302.     
  303. problem:
  304.     ErrMsgCode("\pError installing AppleEvent handlers.", err);
  305.     return err;
  306. }
  307.  
  308. // ------------------------------------------------------------------------- 
  309. static pascal OSErr AEOpenHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  310. {
  311.     return ( noErr );
  312. }
  313.  
  314. static pascal OSErr AEOpenDocHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  315. {
  316.     return ( noErr );
  317. }
  318.  
  319. static pascal OSErr AEPrintHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  320. {
  321.     return ( noErr );
  322. }
  323.  
  324. static pascal OSErr AEQuitHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  325. {
  326.     gDone = true;
  327.     return ( noErr );
  328. }
  329. // ------------------------------------------------------------------------- 
  330.  
  331.  
  332. //----------------------------------------------------
  333. // Error handling
  334. #define KEEP_GOING 1
  335. #define DEBUGGER 2
  336. #define EXITTOSHELL 3
  337.  
  338. static void Msg(Str255 msg) // Display an Alert with the string passed.
  339. {
  340.     ParamText(msg,nil,nil,nil);
  341.     Alert(130, nil);
  342. }
  343.  
  344. void ErrMsgCode(Str255 msg, short code)
  345. //    Display error alert with error code. Will also display MemErr and ResErr for you.
  346.     Str31    codeStr;
  347.     Str31    memErrStr;
  348.     Str31    resErrStr;
  349.     short    disposition;
  350.     
  351.     if (code)
  352.         NumToString(code, codeStr);
  353.     else
  354.         codeStr[0] = 0;
  355.     NumToString(LMGetMemErr(), memErrStr);
  356.     NumToString(LMGetResErr(), resErrStr);
  357.     ParamText(msg, codeStr, memErrStr, resErrStr);
  358.     disposition = Alert(128, nil);
  359.     
  360.     switch (disposition)
  361.     {
  362.         case    KEEP_GOING:        return; break;
  363.         case    DEBUGGER:        DebugStr("\p Doing a Stack Crawl;sc6"); break;
  364.         case    EXITTOSHELL:    ExitToShell(); break;
  365.     }
  366. }
  367.  
  368. //----------------------------------------------------
  369. void ErrMsg(Str255 msg) // No error code desired.
  370. {
  371.     ErrMsgCode(msg, 0);
  372. }
  373.  
  374.  
  375. //------------------------------------
  376. void pcat(StringPtr d, StringPtr s)
  377. {
  378.     short    i, j;
  379.  
  380.     if (((j = s[0]) + d[0]) > 255)
  381.         j = 255 - d[0]; // Limit dest string to 255
  382.  
  383.     for (i = 0; i < j;) d[++d[0]] = s[++i];
  384. }
  385.